/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pck_tramitedocu.pck_src.pck_business;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import pck_tramitedocu.pck_src.pck_dao.Cls_dao_Mybatis_Jdbc_Connection;
import pck_tramitedocu.pck_src.pck_pojos.*;
import pck_tramitedocu.pck_src.pck_utiles.Cls_InvocaWebService;
import pck_tramitedocu.pck_src.pck_utiles.Cls_Parametros;
import pck_tramitedocu.pck_src.pck_utiles.Cls_Seguridad_DESBase64;
import pck_tramitedocu.pck_src.pck_utiles.cls_utilitarios;
import pck_tramitedocu.pck_src.pck_utiles.enums.TipoEmailElementsEnum;

/**
 *
 * @author USUARIO
 */
public class Cls_BatchProccess extends QuartzJobBean {

    private Cls_dao_Mybatis_Jdbc_Connection cls_dao_Mybatis_Jdbc_Connection;
    private Cls_MailBusiness mailBusinessService;

    @Override
    protected void executeInternal(JobExecutionContext jec) throws JobExecutionException {
        notifyCloseDocument();
    }

    private void notifyCloseDocument() {
        CallableStatement ct = null;
        List<Object[]> objectList = new ArrayList<Object[]>();
        List<Object[]> objectListFil = new ArrayList<Object[]>();
        List<Cls_documento> documentList = new ArrayList<Cls_documento>();
        Map<String, String> mapEmails = new HashMap<String, String>();
        try {
            StringBuilder queryGetDocuments = new StringBuilder();
            queryGetDocuments.append("SELECT ");
            queryGetDocuments.append("   doc.TIPO_DOCU, doc.NUMERO_DOCU, doc.ANHIO_DOCU,doc.DIAS_RESPUESTA_DOCU,doc.TIEMPO_RESPUESTA_DOCU, ");
            queryGetDocuments.append(" doc.PROYECTO_DOCU,doc.FECHA_CIERRE_DOCU,doc.FECHA_GENERACION_DOCU ");
            queryGetDocuments.append("FROM TB_DOCUMENTO doc ");
            queryGetDocuments.append("WHERE doc.TIEMPO_RESPUESTA_DOCU = CURRENT_DATE");

            Connection connection = cls_dao_Mybatis_Jdbc_Connection.getDataSource().getConnection();
            Statement st = connection.createStatement();
            ResultSet rs = st.executeQuery(queryGetDocuments.toString());
            while (rs.next()) {
                Object[] objectData = {rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getDate(7), rs.getDate(8)};
                objectList.add(objectData);
            }
            st.close();
            rs.close();
            String fechaRespuesta;
            Date fechaEmision;
            Date fechaRespuestaupd;
            for (Object[] document : objectList) {
                if ((document[5] + "").equalsIgnoreCase("t")) {
                    fechaEmision = (Date) document[6];
                } else {
                    fechaEmision = (Date) document[7];
                }
                ct = connection.prepareCall("{?=call fun_documento_calc_fecha_respuesta(?,?)}");
                ct.registerOutParameter(1, 91);
                ct.setInt(2, Integer.parseInt(document[3] + ""));
                ct.setDate(3, (java.sql.Date) fechaEmision);
                ct.execute();
                fechaRespuesta = document[4] + "";
                fechaRespuestaupd = ct.getDate(1);
                if (fechaRespuesta.equals(fechaRespuestaupd + "")) {
                    Object[] objectData = {document[0], document[1], document[2]};
                    objectListFil.add(objectData);
                } else {
                    fechaRespuestaupd = (java.sql.Date) fechaRespuestaupd;
                    StringBuilder queryGetId = new StringBuilder();
                    queryGetId.append("UPDATE ");
                    queryGetId.append(" TB_DOCUMENTO SET TIEMPO_RESPUESTA_DOCU ='" + fechaRespuestaupd + "' ");
                    queryGetId.append("WHERE TIPO_DOCU = '" + document[0] + "' AND  ");
                    queryGetId.append("      NUMERO_DOCU = " + document[1] + " AND ");
                    queryGetId.append("      ANHIO_DOCU = '" + document[2] + "'");
                    st = connection.createStatement();
                    st.executeUpdate(queryGetId.toString());
                }
            }
            connection.close();
            for (Object[] document : objectListFil) {
                StringBuilder queryGetId = new StringBuilder();
                queryGetId.append("SELECT ");
                queryGetId.append("     doc.FECHA_GENERACION_DOCU, doc.DIAS_RESPUESTA_DOCU, CURRENT_DATE, doc.COPIA_DOCU, doc.FIRMA_DNI_DOCU, ");
                queryGetId.append("     dod.CODIGO_DNI_DOCU_DEST, doc.USUARIO_CREA_DOCUMENTO_DOCU, ");
                queryGetId.append("     doc.CABECERA_DOCU, doc.ASUNTO_DOCU ");
                queryGetId.append("FROM TB_DOCUMENTO doc ");
                queryGetId.append("   INNER JOIN TB_DOCUMENTO_DESTINATARIO dod ");
                queryGetId.append("     ON dod.TIPO_DOCUMENTO_DOCU_DEST = doc.TIPO_DOCU AND ");
                queryGetId.append("        dod.NUMERO_DOCUMENTO_DOCU_DEST = doc.NUMERO_DOCU AND ");
                queryGetId.append("        dod.ANHIO_DOCUMENTO_DOCU_DEST = doc.ANHIO_DOCU ");
                queryGetId.append("WHERE doc.TIPO_DOCU = '" + document[0] + "' AND  ");
                queryGetId.append("      doc.NUMERO_DOCU = " + document[1] + " AND ");
                queryGetId.append("      doc.ANHIO_DOCU = '" + document[2] + "'");
                connection = cls_dao_Mybatis_Jdbc_Connection.getDataSource().getConnection();
                st = connection.createStatement();
                rs = st.executeQuery(queryGetId.toString());
                while (rs.next()) {
                    String cabecera = rs.getString(8);
                    String asunto = rs.getString(9);
                    List<String> emailsByDocumentObject = new ArrayList<String>();
                    for (int j = 5; j < 8; j++) {
                        String codeUsser = rs.getString(j).trim();
                        if (mapEmails.get(codeUsser) == null) {
                            mapEmails.put(codeUsser, codeUsser.trim());
                        }
                        if (emailsByDocumentObject.indexOf(codeUsser) == -1) {
                            emailsByDocumentObject.add(codeUsser);
                        }
                    }
                    Cls_documento documentObject = new Cls_documento();
                    documentObject.setTipo_documento(document[0].toString());
                    documentObject.setNumero_documento(Long.parseLong(document[1].toString()));
                    documentObject.setAnhio(document[2].toString());
                    documentObject.setCon_copia_usuarios(cls_utilitarios.getArrayStringFromList(emailsByDocumentObject));
                    documentObject.setCabecera(cabecera);
                    documentObject.setAsunto(asunto);
                    documentList.add(documentObject);
                }
                st.close();
                rs.close();
                connection.close();
            }
            sendNotificacionByEmail(documentList, mapEmails);
        } catch (SQLException ex) {
            Logger.getLogger(Cls_BatchProccess.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void sendNotificacionByEmail(List<Cls_documento> documentList, Map<String, String> mapData) {
        Iterator entries = mapData.entrySet().iterator();
        while (entries.hasNext()) {
            Entry thisEntry = (Entry) entries.next();
            Map<String, Object> mapEmail = new HashMap<String, Object>();
            mapEmail.put(Cls_Parametros.Map_DNI, thisEntry.getValue());
            String usserMail = Cls_InvocaWebService.validarLoginRRHHWs(mapEmail).get(0).getCorreo();
            thisEntry.setValue(usserMail);
        }
        StringBuffer html = new StringBuffer();
        for (Cls_documento document : documentList) {
            Cls_Email emailToSend = new Cls_Email();
            List<String> emailListToSend = new ArrayList<String>();
            for (Cls_Copia_Documento codeUsser : document.getCon_copia_usuarios()) {
                emailListToSend.add(mapData.get(codeUsser.getNombre()));
            }
            emailToSend.setEmail(emailListToSend);
            emailToSend.setMensateSubject(TipoEmailElementsEnum.ASUNTO_DOCUMENTO_VENCIDO.getValor());
            emailToSend.setRemitente(TipoEmailElementsEnum.REMITENTE.getValor());
            html.setLength(0);
            html.append("<table><tr><img src=\"");
            html.append(Cls_Parametros.IP_WEBSERVICE);
            html.append(Cls_Parametros.PORT_WEBSERVICE);
            html.append("tramitedocuweb/images/logo-epsgrau.jpg\"<td>");
            html.append("<h2><strong><u><font color='#5882FA'/>SISTEMA WEB DE TRÁMITE DOCUMENTARIO</u></strong></h2></td></tr><tr><td><i><font color='#5882FA'/>Fecha de respuesta de un documento generado para usted ha vencido</i><td></tr><tr><td><br></td></tr><tr><td>Documento: \n\n\t\t\t<strong>");
            html.append(document.getCabecera().replace("°", "."));
            html.append("</strong><td></tr><tr><td>Asunto: ");
            html.append("\n\n\t\t\t <strong>");
            html.append(document.getAsunto());
            html.append("</strong><td></tr><tr><td><br></td></tr><tr><td>Si desea ver los detalles hacer click en el Siguiente Link</td></tr><tr><td><br></tr><tr><td><a href='");
            html.append(Cls_Parametros.IP_WEBSERVICE);
            html.append(Cls_Parametros.PORT_WEBSERVICE);
            html.append("tramitedocuweb/Visualizar.jsp?");
            html.append(Cls_Parametros.Request_Codigo_DOCUMENTO + "=");
            html.append(new Cls_Seguridad_DESBase64().encriptar(document.obtenerCodigoConcatenado()));
            html.append("'>Visualizar</a></td></tr></table>");
            emailToSend.setMensajeText(html.toString());

            try {
                mailBusinessService.enviarMensaje(emailToSend);
            } catch (Exception ex) {
                Logger.getLogger(Cls_BatchProccess.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void setCls_dao_Mybatis_Jdbc_Connection(Cls_dao_Mybatis_Jdbc_Connection cls_dao_Mybatis_Jdbc_Connection) {
        this.cls_dao_Mybatis_Jdbc_Connection = cls_dao_Mybatis_Jdbc_Connection;
    }

    public Cls_MailBusiness getMailBusinessService() {
        return mailBusinessService;
    }

    public void setMailBusinessService(Cls_MailBusiness mailBusinessService) {
        this.mailBusinessService = mailBusinessService;
    }
}
